package com.wtgroup.demo.mianshi.设计模式.单例;

/**
 * @author dafei
 * @version 0.1
 * @date 2020/6/12 10:18
 */
public class 懒汉1_双重检查锁定 {

}
class SingletonLh1 {
    // ~~volatile 保证竞争实例化时, 线程立马可见别的线程实例化后的实例.~~
    // 更: synchronized 本身应该是保证可见性的. 而此处 volatile 主要是避免指令重排序引起的安全问题.
    public static volatile SingletonLh1 INSTANCE; // 不实例化

    // 私有构造
    private SingletonLh1(){}

    public static SingletonLh1 getInstance() {
        if (INSTANCE==null) { // 一旦第一次竞争实例化后, 后面都会false, 直接return实例.
            synchronized (SingletonLh1.class) {
                if (INSTANCE == null) { // 本线程走到这里时, 有可能其他线程已经前线同步并实例化了, name本线程就不能在实例化了, 而是直接return.
                    INSTANCE = new SingletonLh1();
                }
            }
        }

        return INSTANCE;
    }

}
